package br.edu.ufersa.scrumgame.modelo;

import java.util.List;

import javax.persistence.*;

import br.edu.ufersa.scrumgame.modelo.sistema.Dia;

@Entity
@NamedQueries( {
	@NamedQuery(name = "SprintBacklog.findConcluidoByEmail", query = "select u from SprintBacklog u where u.jogador.email = :email and diaFimExecucao is not null"),
	@NamedQuery(name = "SprintBacklog.findByEmail", query = "select u from SprintBacklog u where u.jogador.email = :email and diaFimExecucao is null")
})
public class SprintBacklog {
	
	@Id
	@SequenceGenerator(name = "sprintBacklog_seq", sequenceName = "sprintBacklog_seq")
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sprintBacklog_seq")
	private int id;
	
	private String titulo;
	
	@Column(length = 5000)
	private String descricao;
	
	private double ganhoScrums;
	
	private int ganhoExperiencia;
	
	private int maxDiaConclusao;
	
	@ManyToOne
	@JoinColumn(name = "id_nivel")
	private Nivel nivel;
	
	@ManyToOne
	@JoinColumn(name = "id_diaInicioExecucao")
	private Dia diaInicioExecucao;
	
	@ManyToOne
	@JoinColumn(name = "id_diaFimExecucao")
	private Dia diaFimExecucao;
	
	@ManyToOne
	@JoinColumn(name = "id_jogador")
	private Jogador jogador;
	
	@ManyToOne
	@JoinColumn(name = "id_papel")
	private Papel papel;
	
	@OneToMany(mappedBy="sprintBacklog", targetEntity = Atividade.class, fetch = FetchType.EAGER, cascade = CascadeType.ALL)
	private List<Atividade> atividades;
	
	
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getTitulo() {
		return titulo;
	}

	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public Nivel getNivel() {
		return nivel;
	}

	public void setNivel(Nivel nivel) {
		this.nivel = nivel;
	}

	public double getGanhoScrums() {
		return ganhoScrums;
	}

	public void setGanhoScrums(double ganhoScrums) {
		this.ganhoScrums = ganhoScrums;
	}

	public int getGanhoExperiencia() {
		return ganhoExperiencia;
	}

	public void setGanhoExperiencia(int ganhoExperiencia) {
		this.ganhoExperiencia = ganhoExperiencia;
	}

	public int getMaxDiaConclusao() {
		return maxDiaConclusao;
	}

	public void setMaxDiaConclusao(int maxDiaConclusao) {
		this.maxDiaConclusao = maxDiaConclusao;
	}

	public Dia getDiaInicioExecucao() {
		return diaInicioExecucao;
	}

	public void setDiaInicioExecucao(Dia diaInicioExecucao) {
		this.diaInicioExecucao = diaInicioExecucao;
	}

	public Dia getDiaFimExecucao() {
		return diaFimExecucao;
	}

	public void setDiaFimExecucao(Dia diaFimExecucao) {
		this.diaFimExecucao = diaFimExecucao;
	}

	public Jogador getJogador() {
		return jogador;
	}

	public void setJogador(Jogador jogador) {
		this.jogador = jogador;
	}

	public Papel getPapel() {
		return papel;
	}

	public void setPapel(Papel papel) {
		this.papel = papel;
	}

	public List<Atividade> getAtividades() {
		return atividades;
	}

	public void setAtividades(List<Atividade> atividades) {
		this.atividades = atividades;
	}
	
	public boolean isCompleted() {
		boolean completed = true;
		
		for( Atividade a : atividades ) {
			if( a.getDefinida() == 0 ) {
				completed = false;
			}
		}
		
		return completed;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((descricao == null) ? 0 : descricao.hashCode());
		result = prime * result + ((diaFimExecucao == null) ? 0 : diaFimExecucao.hashCode());
		result = prime * result + ((diaInicioExecucao == null) ? 0 : diaInicioExecucao.hashCode());
		result = prime * result + ganhoExperiencia;
		long temp;
		temp = Double.doubleToLongBits(ganhoScrums);
		result = prime * result + (int) (temp ^ (temp >>> 32));
		result = prime * result + id;
		result = prime * result + ((jogador == null) ? 0 : jogador.hashCode());
		result = prime * result + maxDiaConclusao;
		result = prime * result + ((nivel == null) ? 0 : nivel.hashCode());
		result = prime * result + ((papel == null) ? 0 : papel.hashCode());
		result = prime * result + ((titulo == null) ? 0 : titulo.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		SprintBacklog other = (SprintBacklog) obj;
		if (descricao == null) {
			if (other.descricao != null)
				return false;
		} else if (!descricao.equals(other.descricao))
			return false;
		if (diaFimExecucao == null) {
			if (other.diaFimExecucao != null)
				return false;
		} else if (!diaFimExecucao.equals(other.diaFimExecucao))
			return false;
		if (diaInicioExecucao == null) {
			if (other.diaInicioExecucao != null)
				return false;
		} else if (!diaInicioExecucao.equals(other.diaInicioExecucao))
			return false;
		if (ganhoExperiencia != other.ganhoExperiencia)
			return false;
		if (Double.doubleToLongBits(ganhoScrums) != Double.doubleToLongBits(other.ganhoScrums))
			return false;
		if (id != other.id)
			return false;
		if (jogador == null) {
			if (other.jogador != null)
				return false;
		} else if (!jogador.equals(other.jogador))
			return false;
		if (maxDiaConclusao != other.maxDiaConclusao)
			return false;
		if (nivel == null) {
			if (other.nivel != null)
				return false;
		} else if (!nivel.equals(other.nivel))
			return false;
		if (papel == null) {
			if (other.papel != null)
				return false;
		} else if (!papel.equals(other.papel))
			return false;
		if (titulo == null) {
			if (other.titulo != null)
				return false;
		} else if (!titulo.equals(other.titulo))
			return false;
		return true;
	}

}
